Матем.отд
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 

(******************************************************************************)
(**)                        ОТДЕЛ Матем;
(******************************************************************************
 * НАЗНАЧЕНИЕ: основные математические функции
 ******************************************************************************
 * ПРИМЕЧАНИЯ: после вызова задачи переменная <Матем.код> может стать # 0,
 * это означает, что ответ задачи содержит не результат вычислений, а
 * особое значение.
 *
 * Источники, ссылки, библиография
   Debord J., Библиотека математических подпрограмм
   tpmath.zip

   Goffe B., Программа SimAnn.FOR (Simulated Annealing in Fortran)
   http://www.netlib.org/opt/simann.f

   EISPACK: Библиотека Фортран функций для вычисления собственных значений и векторов
   http://www.netlib.org/eispack

   Marsaglia G., Тесты для генераторов случайных чисел
   http://stat.fsu.edu/~geo/diehard.html

   Moshier S., Библиотека математических подпрограмм
   http://www.moshier.net

   Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P.
   Численные рецепты на Паскале
   http://garbo.uwasa.fi/pc/turbopas.html

   Пакет численных методов для Турбо Паскаля
   Borland International, 1986
 *
 ******************************************************************************)
ИСПОЛЬЗУЕТ 
  Асм ИЗ "..\Иное\",
  ОС  ИЗ "..\Обмен\";

(******************************************************************************
 * Вид, задающий точность вычислений
 ******************************************************************************)
ВИД 
  Вещ- = ШИРВЕЩ;            

(******************************************************************************
 * Код ошибки после выполнения функций
 ******************************************************************************)
ПОСТ
  ВНЕОБЛАСТИ-  = -1; (* аргумент вне области определения функции *)
  ОСОБЕННОСТЬ- = -2; (* особенная точка                          *)
  ПЕРЕПОЛНЕНИЕ-= -3; (* переполнение результата                  *)
  ОБНУЛЕНИЕ-   = -4; (* обнуление результата                     *)

ПЕР
  код+:ЦЕЛ;   (* переменная для опознавания результата функций *)
  пГаусс:Вещ; (* память для следующего случ. числа, распределенного по Гауссу *)
  впГаусс:КЛЮЧ; (* ВКЛ, если <пГаусс> уже содержит число *)

(******************************************************************************
 * Математические постоянные
 ******************************************************************************)
ПОСТ
  ПИ-         = 3.14159265358979323846D0; (* ПИ              *)
  ПИ2-        = 6.28318530717958647693D0; (* 2*ПИ            *)
  ЛН2-        = 0.69314718055994530942D0; (* ln(2)           *)
  ЛН10-       = 2.30258509299404568402D0; (* ln(10)          *)
  ЛНПИ-       = 1.14472988584940017414D0; (* ln(ПИ)          *)
  КВКОР2-     = 1.41421356237309504880D0; (* квкор(2)        *)
  КВКОР2ПИ-   = 2.50662827463100050242D0; (* квкор(2*ПИ)     *)
  КВКОР2Д2-   = 0.70710678118654752440D0; (* квкор(2)/2      *)
  ЛНКВКОР2ПИ- = 0.91893853320467274178D0; (* ln(квкор(2*ПИ)) *)

(******************************************************************************
 * Машино-зависимые постоянные
 ******************************************************************************)
ПОСТ
  МАКСВЕЩ- =  МАКС(Вещ);
  МАКСЛН-  =  709.7827128933840D0;
  МИНЛН-   = -708.3964185322641D0;
  МАШЕПС-  =  2.220446049250313D-16; 

(******************************************************************************
 * Тригонометрические функции
 ******************************************************************************)
                                                    (* заготовки ЗАДАЧ *)
ЗАДАЧА^ sin-(x:Вещ):Вещ;
ЗАДАЧА^ arcsin-(x:Вещ):Вещ;       
ЗАДАЧА^ cos-(x:Вещ):Вещ;
ЗАДАЧА^ arccos-(x:Вещ):Вещ;       
ЗАДАЧА^ sincos-(x,sinX+,cosX+:Вещ);
ЗАДАЧА^ tg-(x:Вещ):Вещ;          
ЗАДАЧА^ arctg-(x:Вещ):Вещ;
ЗАДАЧА^ arctg2-(y,x:Вещ):Вещ;    (* угол (Ox,OM) для m(x,y) *)
ЗАДАЧА^ Пифагор-(x,y:Вещ):Вещ;   (* квкор(x2+y2) *)
ЗАДАЧА^ уголВПи-(тета:Вещ):Вещ;  (* угол в -ПИ..ПИ *)

(******************************************************************************
 * Логарифмические, показательные и степенные функции
 ******************************************************************************)
                                                    (* заготовки ЗАДАЧ *)
ЗАДАЧА^ exp-(x:Вещ):Вещ;           
ЗАДАЧА^ exp2-(x:Вещ):Вещ;  (* 2x *)
ЗАДАЧА^ exp10-(x:Вещ):Вещ; (* 10x *)

ЗАДАЧА^ ln-(x:Вещ):Вещ;                   
ЗАДАЧА^ log2-(x:Вещ):Вещ;  (* ln по основанию 2 *)
ЗАДАЧА^ log10-(x:Вещ):Вещ; (* десятичный логарифм *)
ЗАДАЧА^ loga-(x,a:Вещ):Вещ;(* ln по основанию a *)

ЗАДАЧА^ степВЦ-(x:Вещ; n:ЦЕЛ):Вещ;       (* xn *)
ЗАДАЧА^ степВВ-(x,y:Вещ):Вещ;            (* xy, x >= 0 *)
ЗАДАЧА^ кв-(x:Вещ):Вещ;                  (* x*x = x2 *)
ЗАДАЧА^ квкор-(x:Вещ):Вещ;               (* x0,5 *)

(******************************************************************************
 * Гиперболические функции
 ******************************************************************************)
                                                    (* заготовки ЗАДАЧ *)
ЗАДАЧА^ sh-(x:Вещ):Вещ; 
ЗАДАЧА^ ch-(x:Вещ):Вещ; 
ЗАДАЧА^ shch-(x:Вещ; shX+,chX+:Вещ);  
ЗАДАЧА^ th-(x:Вещ):Вещ;       
ЗАДАЧА^ Arsh-(x:Вещ):Вещ;    
ЗАДАЧА^ Arch-(x:Вещ):Вещ;    
ЗАДАЧА^ Arth-(x:Вещ):Вещ;    

(******************************************************************************
 * мин, макс, знак числа и обмен 2-х чисел
 ******************************************************************************)
                                                    (* заготовки ЗАДАЧ *)
ЗАДАЧА^ мин-(x,y:Вещ):Вещ;          
ЗАДАЧА^ макс-(x,y:Вещ):Вещ;          

ЗАДАЧА^ минЦ-(x,y:ЦЕЛ):ЦЕЛ;
ЗАДАЧА^ максЦ-(x,y:ЦЕЛ):ЦЕЛ;          

ЗАДАЧА^ знак-(x:Вещ):ЦЕЛ;     
ЗАДАЧА^ знак2-(x,y:Вещ):Вещ;  (* x*знак(y) *)
                                                  
ЗАДАЧА^ обмен-(x+,y+:Вещ);   
ЗАДАЧА^ обменЦ-(x+,y+:ЦЕЛ);
                                  
(******************************************************************************
 * Источники случайных чисел
 ******************************************************************************)
                                                    (* заготовки ЗАДАЧ *)
ЗАДАЧА^ случ0-(случ:ЦЕЛ); (* Выставка источника случайных чисел в начальное состояние *)
ЗАДАЧА^ случЦ-():ЦЕЛ;     (* целые от -2147483648 до 2147483647 *)
ЗАДАЧА^ случ-():Вещ;  (* вещественные в интервале [0,1) (т.е. не включая 1) *)
ЗАДАЧА^ случСГ-():Вещ;(* вещественные, распределённые по стандартному Гауссу (мю=0,сигма=1) *)
ЗАДАЧА^ случГ-(мю,сигма:Вещ):Вещ;(* вещественные, распределённые по Гауссу *)

(******************************************************************************
 * мин, макс, знак, обмен
 ******************************************************************************)

(******************************************************************************)
ЗАДАЧА мин-(x,y:Вещ):Вещ;
УКАЗ
  ЕСЛИ x < y ТО
    ВОЗВРАТ x
  ИНАЧЕ
    ВОЗВРАТ y
  КОН
КОН мин;

(******************************************************************************)
ЗАДАЧА макс-(x,y:Вещ):Вещ;
УКАЗ
  ЕСЛИ x > y ТО
    ВОЗВРАТ x
  ИНАЧЕ
    ВОЗВРАТ y
  КОН
КОН макс;

(******************************************************************************)
ЗАДАЧА минЦ-(x,y:ЦЕЛ):ЦЕЛ;
УКАЗ
  ЕСЛИ x < y ТО
    ВОЗВРАТ x
  ИНАЧЕ
    ВОЗВРАТ y
  КОН
КОН минЦ;

(******************************************************************************)
ЗАДАЧА максЦ-(x,y:ЦЕЛ):ЦЕЛ;
УКАЗ
  ЕСЛИ x > y ТО
    ВОЗВРАТ x
  ИНАЧЕ
    ВОЗВРАТ y
  КОН
КОН максЦ;

(******************************************************************************)
ЗАДАЧА знак-(x:Вещ):ЦЕЛ;
УКАЗ
  ЕСЛИ x >= 0 ТО
    ВОЗВРАТ 1
  ИНАЧЕ
    ВОЗВРАТ -1
  КОН
КОН знак;

(******************************************************************************)
ЗАДАЧА знак2-(x,y:Вещ):Вещ;
УКАЗ
  ЕСЛИ y < 0 ТО
    ВОЗВРАТ -МОДУЛЬ(x)
  ИНАЧЕ
    ВОЗВРАТ МОДУЛЬ(x)
  КОН
КОН знак2;

(******************************************************************************)
ЗАДАЧА обмен-(x+,y+:Вещ);
ПЕР
  врем:Вещ;
УКАЗ
  врем:=x;
  x:=y;
  y:=врем
КОН обмен;

(******************************************************************************)
ЗАДАЧА обменЦ-(x+,y+:ЦЕЛ);
ПЕР
  врем:ЦЕЛ;
УКАЗ
  врем:=x;
  x:=y;
  y:=врем
КОН обменЦ;

(******************************************************************************
 * Основные математические функции                                  
 ******************************************************************************)

(******************************************************************************)
ЗАДАЧА кв-(x:Вещ):Вещ;
УКАЗ
  код:=0;
  ВОЗВРАТ x*x
КОН кв;

(******************************************************************************)
ЗАДАЧА квкор-(x:Вещ):Вещ;
УКАЗ
  ЕСЛИ x < 0 ТО
    код:=ВНЕОБЛАСТИ;
    ВОЗВРАТ 0
  КОН;
  код:=0;
  ВОЗВРАТ Асм.квкор(x)
КОН квкор;

(******************************************************************************)
ЗАДАЧА exp-(x:Вещ):Вещ;
УКАЗ
  ЕСЛИ x < МИНЛН ТО
    код:=ОБНУЛЕНИЕ;
    ВОЗВРАТ 0
  АЕСЛИ x > МАКСЛН ТО
    код:=ПЕРЕПОЛНЕНИЕ;
    ВОЗВРАТ МАКСВЕЩ
  КОН;
  код:=0;
  ВОЗВРАТ Асм.exp(x)
КОН exp;

(******************************************************************************)
ЗАДАЧА exp2-(x:Вещ):Вещ;
ПЕР
  xLn2:Вещ;
УКАЗ
  xLn2:=x*ЛН2;
  ЕСЛИ xLn2 < МИНЛН ТО
    код:=ОБНУЛЕНИЕ;
    ВОЗВРАТ 0
  АЕСЛИ xLn2 > МАКСЛН ТО
    код:=ПЕРЕПОЛНЕНИЕ;
    ВОЗВРАТ МАКСВЕЩ
  КОН;
  код:=0;
  ВОЗВРАТ exp(xLn2)
КОН exp2;

(******************************************************************************)
ЗАДАЧА exp10-(x:Вещ):Вещ;
ПЕР
  xLn10:Вещ;
УКАЗ
  xLn10:=x*ЛН10;
  ЕСЛИ xLn10 < МИНЛН ТО
    код:=ОБНУЛЕНИЕ;
    ВОЗВРАТ 0
  АЕСЛИ xLn10 > МАКСЛН ТО
    код:=ПЕРЕПОЛНЕНИЕ;
    ВОЗВРАТ МАКСВЕЩ
  КОН;
  код:=0;
  ВОЗВРАТ exp(xLn10)
КОН exp10;

(******************************************************************************)
ЗАДАЧА ln-(x:Вещ):Вещ;
УКАЗ
  ЕСЛИ x < 0 ТО
    код:=ВНЕОБЛАСТИ;
    ВОЗВРАТ -МАКСВЕЩ
  АЕСЛИ x = 0 ТО
    код:=ОСОБЕННОСТЬ;
    ВОЗВРАТ -МАКСВЕЩ
  КОН;
  код:=0;
  ВОЗВРАТ Асм.ln(x)
КОН ln;

(******************************************************************************)
ЗАДАЧА log10-(x:Вещ):Вещ;
УКАЗ
  ЕСЛИ x < 0 ТО
    код:=ВНЕОБЛАСТИ;
    ВОЗВРАТ -МАКСВЕЩ
  АЕСЛИ x = 0 ТО
    код:=ОСОБЕННОСТЬ;
    ВОЗВРАТ -МАКСВЕЩ
  КОН;
  код:=0;
  ВОЗВРАТ ln(x)/ЛН10 
КОН log10;

(******************************************************************************)
ЗАДАЧА log2-(x:Вещ):Вещ;
УКАЗ
  ЕСЛИ x < 0 ТО
    код:=ВНЕОБЛАСТИ;
    ВОЗВРАТ -МАКСВЕЩ
  АЕСЛИ x = 0 ТО
    код:=ОСОБЕННОСТЬ;
    ВОЗВРАТ -МАКСВЕЩ
  КОН;
  код:=0;
  ВОЗВРАТ ln(x)/ЛН2
КОН log2;

(******************************************************************************)
ЗАДАЧА loga-(x,a:Вещ):Вещ;
ПЕР
  y:Вещ;
УКАЗ
  y:=ln(x);
  ЕСЛИ код = 0 ТО
    ЕСЛИ a = 1 ТО
      код:=ОСОБЕННОСТЬ;
      y:=знак2(МАКСВЕЩ,y)
    ИНАЧЕ
      y:=y/ln(a)
    КОН 
  КОН;
  ВОЗВРАТ y
КОН loga;

(******************************************************************************
 * Степенные функции
 ******************************************************************************)

(******************************************************************************)
ЗАДАЧА пробаСтеп(x,y,отв+:Вещ):КЛЮЧ;
(* Проверка случаев x=0, y=0 и y=1. После xy в <отв> *)
УКАЗ
  код:=0;
  ЕСЛИ x = 0 ТО
    ЕСЛИ y = 0 ТО     (*  00 = lim xx = 1 *)
      отв:=1          (*           x->0    *)
    АЕСЛИ y > 0 ТО
      отв:=0          (* 0y = 0 *)
    ИНАЧЕ
      код:=ОСОБЕННОСТЬ;
      отв:=МАКСВЕЩ
    КОН;
    ВОЗВРАТ ВКЛ
  АЕСЛИ y = 0 ТО
    отв:=1;           (* x0 = 1 *)
    ВОЗВРАТ ВКЛ
  АЕСЛИ y = 1 ТО
    отв:=x;           (* x1 = x *)
    ВОЗВРАТ ВКЛ
  ИНАЧЕ
    ВОЗВРАТ ОТКЛ
  КОН
КОН пробаСтеп;

(******************************************************************************)
ЗАДАЧА степВЦ-(x:Вещ; n:ЦЕЛ):Вещ;
(* Вычисление xn с помощью умножений *)
ПОСТ
  ОБРМАКСВЕЩ = 1/МАКСВЕЩ;
ПЕР
  ответ:Вещ;
  переворот:КЛЮЧ;
УКАЗ
  ЕСЛИ пробаСтеп(x,n,ответ) ТО ВОЗВРАТ ответ КОН;

  переворот:=(n < 0); 
  ЕСЛИ 1 < МОДУЛЬ(x) ТО  (* 0 ..|x| .. 1 ? *)
    x:=1/x;
    переворот:=НЕ переворот
  КОН;

  ответ:=1; 
  n:=МОДУЛЬ(n);
  ПОКА 0 < n ВЫП
    ЕСЛИ НЕ ЧЕТ(n) ТО ответ:=ответ*x КОН;
    x:=кв(x);
    n:=n ДЕЛИТЬ 2
  КОН;

  ЕСЛИ переворот ТО
    ЕСЛИ МОДУЛЬ(ответ) < ОБРМАКСВЕЩ ТО  (* только сейчас переполнение *)
      код:=ПЕРЕПОЛНЕНИЕ;
      ответ:=знак2(МАКСВЕЩ,ответ)
    ИНАЧЕ
      ответ:=1/ответ 
    КОН 
  КОН;

  ВОЗВРАТ ответ
КОН степВЦ;

(******************************************************************************)
ЗАДАЧА степВВ-(x,y:Вещ):Вещ;
(* Вычисление xy = exp(y*ln(x)), для x > 0. Если  целый, то степВЦ() *)
ПЕР
  отв:Вещ;
УКАЗ
  ЕСЛИ пробаСтеп(x,y,отв)
  ТО
    ВОЗВРАТ отв
  АЕСЛИ (МОДУЛЬ(y) <= МАКС(ЦЕЛ)) И (ЦЕЛЧАСТЬ(y) = y)
  ТО                                                 (* целый показатель *)
    ВОЗВРАТ степВЦ(x,УЗК(ВШИРЦЕЛ(y)))
  АЕСЛИ x <= 0
  ТО
    код:=ВНЕОБЛАСТИ;
    ВОЗВРАТ 0
  КОН;
  ВОЗВРАТ exp(y*ln(x))
КОН степВВ;

(******************************************************************************)
ЗАДАЧА Пифагор-(x,y:Вещ):Вещ;
(* Вычисление квкор(x2+y2) без разрушения при переполнении и недополнении *)
ПЕР
  modX,modY:Вещ;
УКАЗ
  код:=0;
  modX:=МОДУЛЬ(x);
  modY:=МОДУЛЬ(y);
  ЕСЛИ modX > modY ТО
    ВОЗВРАТ modX*квкор(1+кв(modY/modX))
  АЕСЛИ modY = 0 ТО
    ВОЗВРАТ 0
  КОН;
  ВОЗВРАТ modY*квкор(1+кв(modX/modY))
КОН Пифагор;

(******************************************************************************
 * Тригонометрические функции
 ******************************************************************************)

(******************************************************************************)
ЗАДАЧА уголВПи-(тета:Вещ):Вещ;
УКАЗ
  код:=0;
  ПОКА тета > ПИ ВЫП
    тета:=тета-ПИ2 
  КОН;
  ПОКА тета <=-ПИ ВЫП
    тета:=тета+ПИ2 
  КОН;
  ВОЗВРАТ тета
КОН уголВПи;

(******************************************************************************)
ЗАДАЧА sin-(x:Вещ):Вещ;
УКАЗ
  код:=0;
  ВОЗВРАТ Асм.sin(x)
КОН sin;

(******************************************************************************)
ЗАДАЧА cos-(x:Вещ):Вещ;
УКАЗ
  код:=0;
  ВОЗВРАТ Асм.cos(x)
КОН cos;

(******************************************************************************)
ЗАДАЧА sincos-(x,sinX+,cosX+:Вещ);
УКАЗ
  код:=0;
  Асм.sincos(x,sinX,cosX)
КОН sincos;

(******************************************************************************)
ЗАДАЧА arctg-(x:Вещ):Вещ;
УКАЗ
  код:=0;
  ВОЗВРАТ Асм.arctg(x)
КОН arctg;

(******************************************************************************)
ЗАДАЧА tg-(x:Вещ):Вещ;
ПЕР
  sinX,cosX:Вещ;
УКАЗ
  sincos(x,sinX,cosX);
  ЕСЛИ cosX = 0 ТО
    код:=ОСОБЕННОСТЬ;
    ВОЗВРАТ знак2(МАКСВЕЩ,sinX)
  КОН;
  ВОЗВРАТ sinX/cosX 
КОН tg;

(******************************************************************************)
ЗАДАЧА arcsin-(x:Вещ):Вещ;
ПЕР
  modX:Вещ;
УКАЗ
  modX:=МОДУЛЬ(x);
  ЕСЛИ modX > 1 ТО
    код:=ВНЕОБЛАСТИ;
    ВОЗВРАТ знак2(ПИ/2,x)
  АЕСЛИ modX = 1 ТО
    код:=0;
    ВОЗВРАТ знак2(ПИ/2,x)
  КОН;
  ВОЗВРАТ arctg(x/квкор(1-кв(x)))
КОН arcsin;

(******************************************************************************)
ЗАДАЧА arccos-(x:Вещ):Вещ;
УКАЗ
  код:=0;
  ЕСЛИ x < -1 ТО
    код:=ВНЕОБЛАСТИ;
    ВОЗВРАТ ПИ
  АЕСЛИ x > 1 ТО
    код:=ВНЕОБЛАСТИ;
    ВОЗВРАТ 0
  АЕСЛИ x = 1 ТО
    ВОЗВРАТ 0
  АЕСЛИ x = -1 ТО
    ВОЗВРАТ ПИ
  КОН;
  ВОЗВРАТ ПИ/2-arctg(x/квкор(1-кв(x)))
КОН arccos;

(******************************************************************************)
ЗАДАЧА arctg2-(y,x:Вещ):Вещ;
ПЕР
  тета:Вещ;
УКАЗ
  код:=0;
  ЕСЛИ x = 0 ТО
    ЕСЛИ y = 0 ТО
      ВОЗВРАТ 0
    АЕСЛИ y > 0 ТО
      ВОЗВРАТ ПИ/2
    ИНАЧЕ
      ВОЗВРАТ -ПИ/2
    КОН
  ИНАЧЕ
    (* -ПИ/2..ПИ/2 *)
    тета:=arctg(y/x);
    (* II-III квадранты *)
    ЕСЛИ x < 0 ТО
      ЕСЛИ y >= 0 ТО
        тета:=тета+ПИ   (* ПИ/2..ПИ *)
      ИНАЧЕ
        тета:=тета-ПИ 
      КОН 
    КОН;  (* -ПИ..-ПИ/2 *)
    ВОЗВРАТ тета;
  КОН
КОН arctg2;

(******************************************************************************
 * Гиперболические функции
 ******************************************************************************)

(******************************************************************************)
ЗАДАЧА sh-(x:Вещ):Вещ;
ПЕР
  expX:Вещ;
УКАЗ
  ЕСЛИ (x < МИНЛН) ИЛИ (x > МАКСЛН) ТО
    код:=ПЕРЕПОЛНЕНИЕ;
    ВОЗВРАТ знак2(МАКСВЕЩ,x)
  КОН;
  expX:=exp(x);
  ВОЗВРАТ 0.5*(expX-1/expX)
КОН sh;

(******************************************************************************)
ЗАДАЧА ch-(x:Вещ):Вещ;
ПЕР
  expX:Вещ;
УКАЗ
  ЕСЛИ (x < МИНЛН) ИЛИ (x > МАКСЛН) ТО
    код:=ПЕРЕПОЛНЕНИЕ;
    ВОЗВРАТ МАКСВЕЩ
  КОН;
  expX:=exp(x);
  ВОЗВРАТ 0.5*(expX+1/expX)
КОН ch;

(******************************************************************************)
ЗАДАЧА shch-(x:Вещ; shX+,chX+:Вещ);
ПЕР
  expX,expMinusX:Вещ;
УКАЗ
  ЕСЛИ (x < МИНЛН) ИЛИ (x > МАКСЛН) ТО
    код:=ПЕРЕПОЛНЕНИЕ;
    chX:=МАКСВЕЩ;
    shX:=знак2(chX,x)
  ИНАЧЕ
    expX:=exp(x);
    expMinusX:=1/expX;
    shX:=0.5*(expX-expMinusX);
    chX:=0.5*(expX+expMinusX)
  КОН
КОН shch;

(******************************************************************************)
ЗАДАЧА th-(x:Вещ):Вещ;
ПЕР
  shX,chX:Вещ;
УКАЗ
  shch(x,shX,chX);
  ВОЗВРАТ shX/chX;
КОН th;

(******************************************************************************)
ЗАДАЧА Arsh-(x:Вещ):Вещ;
УКАЗ
  ВОЗВРАТ ln(x+квкор(кв(x)+1))
КОН Arsh;

(******************************************************************************)
ЗАДАЧА Arch-(x:Вещ):Вещ;
УКАЗ
  ЕСЛИ x < 1 ТО
    код:=ВНЕОБЛАСТИ;
    ВОЗВРАТ 0
  КОН;
  ВОЗВРАТ ln(x+квкор(кв(x)-1))
КОН Arch;

(******************************************************************************)
ЗАДАЧА Arth-(x:Вещ):Вещ;
УКАЗ
  ЕСЛИ (x <-1) ИЛИ (x > 1) ТО
    код:=ВНЕОБЛАСТИ;
    ВОЗВРАТ знак2(МАКСВЕЩ,x)
  АЕСЛИ (x =-1) ИЛИ (x = 1) ТО
    код:=ОСОБЕННОСТЬ;
    ВОЗВРАТ знак2(МАКСВЕЩ,x)
  КОН;
  ВОЗВРАТ 0.5*ln((1+x)/(1-x))
КОН Arth;

(******************************************************************************
 * Источники случайных чисел
 ******************************************************************************)

(******************************************************************************)
ЗАДАЧА случ0-(случ:ЦЕЛ);
(* Выставка источника случайных чисел в начальное состояние *)
УКАЗ
  Асм.СлучНач(случ)
КОН случ0;

(******************************************************************************)
ЗАДАЧА случЦ-():ЦЕЛ;
(* Возвращает целые случайные числа из интервала [-2147483648; 2147483647] *)
УКАЗ
  ВОЗВРАТ Асм.СлучЦел()
КОН случЦ;

(******************************************************************************)
ЗАДАЧА случ-():Вещ;
(* Возвращает вещественные случайные числа из интервала [0; 1), т.е. < 1 *)
ПОСТ
  вминус32=1/4294967296; (* 2-32 *)
УКАЗ
  ВОЗВРАТ Асм.СлучЦел()*вминус32+0.5;
КОН случ;

(******************************************************************************)
ЗАДАЧА случСГ-():Вещ;
(* Возвращает вещественные случайные числа, распределенные по стандартному
 * Гауссу (мю=0,сигма=1) *)
ПЕР
  r,тета,sin,cos:Вещ;
УКАЗ
  ЕСЛИ НЕ впГаусс ТО
    r:=квкор(-2*ln(случ()));
    тета:=ПИ2*случ();
    sincos(тета,sin,cos);
    пГаусс:=r*sin;  (* сохраним одно число    *)
    впГаусс:=ВКЛ;
    ВОЗВРАТ r*cos   (* возвратим другое число *)
  КОН;
  впГаусс:=ОТКЛ;
  ВОЗВРАТ пГаусс    (* возвратим сохраненное число *)
КОН случСГ;

(******************************************************************************)
ЗАДАЧА случГ-(мю,сигма:Вещ):Вещ;
(* Возвращает вещественные случайные числа, распределенные по Гауссу *)
УКАЗ
  ВОЗВРАТ мю+сигма*случСГ()
КОН случГ;

(******************************************************************************)
УКАЗ
  код:=0;
  впГаусс:=ОТКЛ;
  случ0(ОС.Время())
КОН Матем.

 
 


Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com

 
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы